package com.kgc.scd.config;

import com.alibaba.fastjson.JSON;
import com.kgc.scd.constant.CommonConstant;
import com.kgc.scd.util.SensitiveWordUtil;
import com.kgc.scd.util.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * Created On : 2022/11/12.
 * <p>
 * Author : zhukang
 * <p>
 * Description: 敏感词缓存，也可以将敏感词处理作为自定义启动器使用
 */
@Slf4j
@Component
public class SensitiveWordCache {

    @Autowired
    private RedisUtils redisUtils;

    // 敏感词集合
    private Map<String, Object> sensitiveWordMap;

    // 应用启动后自动执行此方法
    @PostConstruct
    public void initSensitiveWord() throws IOException{
        log.debug("------- 从redis中读取敏感字，放入缓存 -------");

        // 从redis获取敏感词，
        Object sensitiveWordObj = redisUtils.get(SensitiveWordUtil.getSensitiveWordKey(null));

        // 判断redis是否获取敏感词成功，如果没有获取到，敏感词置空，或者增加对数据库查询，或者读取敏感词文件
        if (sensitiveWordObj == null){
            sensitiveWordMap = new HashMap<>();
            return;
        }

        // 转换为敏感词库Map，考虑：从缓存中获取，减少数据库交互或者文件解析，提高效率
        sensitiveWordMap = JSON.parseObject(sensitiveWordObj.toString(), Map.class);
    }

    /**
     * @author : zhukang
     * @date   : 2022/11/12
     * @param  : []
     * @return : java.util.Map
     * @description : 获取敏感词集合
     */
    public Map<String, Object> getSensitiveWordMap() {

        // 获取redis是否更新敏感词开关
        Object sensitiveSwitchObj = redisUtils.get(CommonConstant.SENSITIVE_WORD_ON_OFF);
        // 如果redis更新了，会打开开关，程序中更新内存敏感词集合
        if(sensitiveSwitchObj != null && "on".equals(sensitiveSwitchObj.toString())){
            try {
                initSensitiveWord();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 返回最新敏感词数据
        return sensitiveWordMap;
    }
}

